package main.java.day11;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * 将聊天室客户端内容独立完成一次.
 * 下面内容可以选做:
 * 修改代码，使聊天室可以实现用户自定义昵称，
 * 以及私聊功能。
 * 
 * 参考思路:
 * 客户端连接服务端后，要求用户输入一个昵称，
 * 然后将改昵称发送给服务端，服务端那边读取到
 * 客户端发送的第一个字符串认为是昵称。
 * 
 * 私聊功能可以定义格式，例如:
 * @张三:你好
 * 服务端在读取客户端发送过来的昵称时，需要进行
 * 解析，分解出昵称与聊天内容，然后将该聊天内容
 * 单独发送给指定昵称的用户。
 * 服务端的输出流需要使用Map进行维护，而不能再
 * 使用List，Map的key可以是该用户昵称，value
 * 为该用户输出流。
 * 
 * 
 * @author Xiloer
 *
 */
public class Client {
    private Socket socket;
    public Client() throws IOException {
        socket=new Socket("localhost",8088);
        System.out.println("已连接服务器！");
    }
    private void inputNickName(Scanner scan) throws  Exception
    {
        String nickName = null;
        //创建输出流
        PrintWriter pw = new PrintWriter(
                new OutputStreamWriter(socket.getOutputStream(),
                        "UTF-8"),true);
        //创建输入流
        BufferedReader br = new BufferedReader(
                new InputStreamReader(
                        socket.getInputStream(),"UTF-8"));

        while(true)
        {
            System.out.println("请创建您的昵称：");
            nickName = scan.nextLine();
            if (nickName.trim().equals(""))
            {
                System.out.println("昵称不得为空");
            }
            else
            {
                pw.println(nickName);
                String pass = br.readLine();
                if(pass!=null&&!pass.equals("OK"))
                {
                    System.out.println("昵称已经被占用，请更换！");
                    break;
                }
                else
                {
                    System.out.println("你好！"+nickName+"可以开始聊天了");
                    break;
                }
            }
        }
    }


    public void start(){
        try {
            System.out.println("请输入：");
            Scanner scanner=new Scanner(System.in);
            inputNickName(scanner);

            ServerHandler server=new ServerHandler();
            Thread t=new Thread(server);
            t.start();


            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
            PrintWriter pw = new PrintWriter(osw,true);

            while(true)
            {
                pw.println(scanner.nextLine());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{

            if(socket !=null)
            {
                try
                {
                    socket.close();
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        Client client=new Client();
        client.start();
    }

    private class ServerHandler implements Runnable{

        public void run() {
            try {
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is,"UTF-8");
                BufferedReader br = new BufferedReader(isr);
                String msgString = null;
                while((msgString = br.readLine())!= null)
                {
                    System.out.println(msgString);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}

